package xcache

import (
	"fmt"
	"strings"
)

// 移除分组缓存
//
//	key	键名称，会提取其中:前面的部分作为分组名，若未指定分组，则移除默认分组
func RemoveGroup[T CacheKey | string](key T) error {
	k := string(key)
	if !strings.Contains(k, ":") {
		k = defaultGroup + ":" + k
	}
	// 提取分组名 :及前面的字符
	k = k[:strings.Index(k, ":")]
	cacheSync.Range(func(key, value interface{}) bool {
		if strings.HasPrefix(key.(string), k) {
			cacheSync.Delete(key)
		}
		return true
	})
	// 移除分级缓存中的分组信息
	for i := 0; i < len(cacheLevel); i++ {
		lis := cacheLevel[i].Keys()
		for j := 0; j < len(lis); j++ {
			if strings.HasPrefix(lis[j], k) {
				cacheLevel[i].Delete(lis[j])
			}
		}
	}
	return nil
}

// 移除缓存配置
//
//	key	缓存key，可以是CacheKey类型或string类型
func Remove[T CacheKey | string](key T) error {
	k := string(key)
	if !strings.Contains(k, ":") {
		k = defaultGroup + ":" + k
	}
	cacheSync.Delete(k)
	for i := 0; i < len(cacheLevel); i++ {
		if err := cacheLevel[i].Delete(k); err != nil {
			return fmt.Errorf("remove cache level %d[%s] error:%w", i, cacheLevel[i].Name(), err)
		}
	}
	return nil
}

// 清空所有缓存
func Clear() error {
	// 1. 清空本地缓存
	cacheSync.Clear()
	// 2. 清空分级缓存
	for i := 0; i < len(cacheLevel); i++ {
		if err := cacheLevel[i].Clear(); err != nil {
			return fmt.Errorf("clear cache level %d[%s] error:%w", i, cacheLevel[i].Name(), err)
		}
	}
	return nil
}
